package com.reggie.service.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.reggie.acl.dataobject.Setmeal;
import com.reggie.service.model.bo.SetmealBO;
import com.reggie.service.model.request.SetmealPageRequest;

import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 套餐 服务类
 * </p>
 *
 * @author yth
 * @since 2023-02-04
 */
public interface SetmealService {

    /**
     * 根据套餐分类id，查询套餐数量
     *
     * @param categoryId 套餐分类id
     * @return 套餐数量
     */
    int countByCategoryId(long categoryId);

    /**
     * 根据套餐名称，分页模糊查询<p>
     * 如果套餐名称为空，则不参与查询<p>
     * 根据更新时间降序排序<p>
     * 包含套餐分类名称
     *
     * @param request 请求
     * @return 分页数据
     */
    IPage<SetmealBO> page(SetmealPageRequest request);

    /**
     * 根据id集合，更新多个套餐的状态
     *
     * @param status 状态 0:停用 1:启用
     * @param ids    id集合
     */
    void updateStatusBatchIds(int status, List<Long> ids);

    /**
     * 根据套餐id集合，批量删除<p>
     * 删除套餐数据、套餐与菜品的关联数据<p>
     * 只有删除的数据中全是“停售”状态的，才可以删除成功，否则抛出异常
     *
     * @param ids 套餐id集合
     */
    void removeBatchIds(List<Long> ids);

    /**
     * 添加套餐、套餐中的关联菜品
     *
     * @param setmealBO 数据
     */
    void saveWithDishes(SetmealBO setmealBO);

    /**
     * 根据套餐id，查询<p>
     * 携带包含菜品数据
     *
     * @param id 套餐id
     * @return 数据
     */
    Optional<SetmealBO> getWithDishById(long id);

    /**
     * 修改套餐数据
     *
     * @param setmealBO 套餐数据
     */
    void update(SetmealBO setmealBO);

    /**
     * 根据套餐分类id、起售状态,查询套餐集合<p>
     * 包含菜品消息<p>
     * 条件之间“与”连接<p>
     * 空值条件不参与查询<p>
     * 结果按更新时间降序排序
     *
     * @param setmeal 查询条件
     * @return 数据
     */
    List<SetmealBO> listWithDish(Setmeal setmeal);

    /**
     * 根据id，获取套餐
     *
     * @param setmealId 套餐id
     * @param status    状态（可选）
     * @return 数据
     */
    Optional<Setmeal> getById(long setmealId, Integer status);
}
